#include <iostream>
#include <vector>
//#include <sys/select.h>
#include <select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <poll.h>
using namespace std;
const int FD_NONE = -1;
class select
{
private:
    size_t _socket;
    size_t _maxnum;
    vector<int> _fd_arr;
public:
    select(size_t maxnum) : _maxnum(maxnum),_fd_arr(_maxnum) 
    {
        for(int i = 0; i< _maxnum; i++)
            _fd_arr[i] = FD_NONE;//手动初始化fd;
        _fd_arr[0] = _socket;//添加文件描述符到fd
    }
    void start()
    {
        while(true)
        {
            fd_set rfds;//具体事件
            FD_ZERO(&rfds);
            int maxfd = _socket;
            for(int i = 0; i <=_maxnum; i++)
            {   
                if(_fd_arr[i] == FD_NONE) continue;//无效
                FD_SET(_fd_arr[i], &rfds);//设置
                if(maxfd < _fd_arr[i]) maxfd = _fd_arr[i];//最大
            }
            int n = select(maxfd + 1, &rfds, nullptr, nullptr, nullptr);//返回就绪的文件描述符个数
            if(n > 0)
            {
                Handle(rfds);
            }
            else break;
        }
    }
}
        void Handle(const fd_set& rfds)//处理
        {
            for(int i = 0; i < _maxnum; i++)
            {
                if(_fd_arr[i] == FD_NONE) continue;
                if(FD_ISSET(_fd_array[i], &rfds))
                {
                    //指定的fd，读事件就绪
                    // 读事件就绪：连接时间到来，accept
                    if(_fd_array[i] == _socket) Accepter();
                        // read / recv? 不能！为什么不能？我们不清楚该sock上面数据什么时候到来， recv、read就有可能先被阻塞，IO = 等+数据拷贝
                        // 谁可能最清楚呢？select！
                        // 得到新连接的时候，此时我们应该考虑的是，将新的sock托管给select，让select帮我们进行检测sock上是否有新的数据
                        // 有了数据select，读事件就绪，select就会通知我，我们在进行读取，此时我们就不会被阻塞了
                        // 要将sock添加 给 select， 其实我们只要将fd放入到数组中即可！
                    else Recver(i);
                }
            }
        }
};


class Poll
{
private:

};